
#pragma once


#include <cstdint>


namespace twixx {

    enum status : int8_t {
        busy = 2,
        pending = 1,
        
        ok = 0,

        // 所有错误情况都用小于0 的错误码表示
        buffer_overflow = -1,

        any_error = -2,

        dma_error = -3,

        not_started = -4,

        not_ended = -5,
    };


    enum frequency : int8_t {
        prefer_1mhz = -3,  // prefer_1MHz，表示从机期望的通信频率是1MHz；主机应该尽量满足期望，除非主机无法达到目标频率
        prefer_400khz = -2,
        prefer_100khz = -1,

        not_care = 0,  // 表示从机不干预主机的频率设定

        max_100khz = 1,  // max_100kHz，表示从机能接受的最大频率是100kHz；如果主机当前频率较高，则降低到这个频率，否则无动作
        max_400khz = 2,
        max_1mhz = 3,
    };


    struct BusConfig {
        uint8_t addr;    // 主机模式下表示从机地址，从机模式下表示自身地址
        frequency freq;  // 通信频率等级，默认 100kHz
    };


    /**
     * @brief 实现I2C 主机收发功能的接口
     *
     */
    class IWireMaster {
       public:
        virtual uint_fast8_t begin_tx(uint_fast8_t slave_addr) = 0;

        virtual uint_fast8_t begin_rx(uint_fast8_t slave_addr) = 0;

        /**
         * @brief 终止或重新开始传输
         * 
         * @param stop     为false 时发送restart 信号，否则发送stop 信号，释放总线
         * @return status 
         */
        virtual status end(bool stop) = 0;

        virtual uint_fast8_t tx(uint_fast8_t b) = 0;       
    };


    /**
     * @brief 为了操作从机寄存器或存储空间而优化的接口
     * 
     */
    class IRegisterOperator {

    };



    /**
     * @brief 可以完成I2C 写操作的接口
     *
     */
    class IWireWriter {
       public:
        virtual uint_fast8_t begin_tx(uint_fast8_t slave_addr) = 0;

        virtual uint_fast8_t end() = 0;

        virtual uint_fast8_t tx(uint_fast8_t b) = 0;

        // virtual int_fast8_t config(const WireConfig &c) = 0;

        virtual ~IWireWriter() = default;
    };

}  // namespace twixx
